// 哈希表-链地址法
#ifndef HASH_MAP_LINKED_H
#define HASH_MAP_LINKED_H

// 最大个数（最大的链表个数）
#define MAX_LINK_HASH_SIZE 100

// 空键定义
#define NULL_KEY "NULL_KEY_VALUE"

/// @brief 哈希表的链结点
typedef struct Node
{
	char key[64];	   // 键
	char value[64];	   // 值
	struct Node *next; // 下一个结点
} HNode;

/// @brief 链地址法处理冲突的哈希表
typedef struct
{
	int count;						 // 元素个数
	HNode nodes[MAX_LINK_HASH_SIZE]; // 哈希表的存放数据的空间（链表）
} LinkedHashMap;

/// @brief 创建一个哈希表
/// @return 哈希表指针
LinkedHashMap *createLinkHashMap();

/// @brief 根据键计算地址（除数留余法）
/// @param key 键
/// @return 地址下标
int hash(char[]);

/// @brief 向哈希表放入元素
/// @param map 哈希表
/// @param key 键
/// @param value 值
void putLinkHashMap(LinkedHashMap *, char[], char[]);

/// @brief 从哈希表取出元素
/// @param map 哈希表
/// @param key 键
/// @return 对应的值
char *getLinkHashMap(LinkedHashMap *, char[]);

/// @brief 删除哈希表中的键值对
/// @param map 哈希表
/// @param key 键
void deleteLinkHashMap(LinkedHashMap *, char[]);

#include "./hash-map_linked.c"

#endif